{
  // Настройки проекта
  "env": {
    // Проект для браузера
    "browser": true,
    // Включаем возможности ES6
    "es6": true,
    // Добавляем возможности ES2017
    "es2017": true
  },
  // Наборы правил
  "extends": [
    // Базовый набор правил eslint
    "eslint:recommended",
    // Отключаем правила из базового набора
    "plugin:@typescript-eslint/eslint-recommended",
    // Базовые правила для TypeScript
    "plugin:@typescript-eslint/recommended",
    // Правила TS, требующие инфо о типах
    "plugin:@typescript-eslint/recommended-requiring-type-checking",
    // Рекомендованные правила для React
    "plugin:react/recommended",
    // Рекомендованные правила работы с хуками
    "plugin:react-hooks/recommended",
    // Отключает все правила форматирования ESLint, которые противоречат Prettier
    "prettier"
  ],
  // Движок парсинга
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "project": "./tsconfig.eslint.json",
    "jsx": true
  },
  // Плагин с наборами правил для TypeScript и для React
  "plugins": ["@typescript-eslint", "react", "react-hooks"],
  "settings": {
    "react": {
      "version": "detect"
    }
  },
  "rules": {
    "@typescript-eslint/no-empty-interface": "off", // Для контейнеров нужны пустые интерфейсы, т.к. возможно измение-расширение ф-ности
    "@typescript-eslint/prefer-regexp-exec": "off",
    "@typescript-eslint/unbound-method": "off",
    // Использование вложенных тернарных операторов запрещено
    "no-nested-ternary": "error",
    // операторы if, else и т.д. должны быть с блоками
    "curly": "error",
    // Запрещаем такие конструкции a && b(), без какого-либо присовения
    "no-unused-expressions": [
      "error",
      { "allowShortCircuit": false, "allowTernary": true }
    ],

    "default-case": "error",
    "eqeqeq": ["error", "always", { "null": "ignore" }],
    "@typescript-eslint/naming-convention": [
      "error",
      {
        "selector": "class",
        "format": ["PascalCase"],
        "leadingUnderscore": "allow"
      },
      {
        "selector": "enum",
        "format": ["PascalCase"]
      }
    ],
    "@typescript-eslint/no-explicit-any": ["error", { "ignoreRestArgs": true }],
    /**
     * Корректное использование правила no-unused-vars
     * https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/docs/rules/no-unused-vars.md
     */
    "no-unused-vars": "off",
    "@typescript-eslint/no-unused-vars": [
      "error",
      { "args": "after-used", "ignoreRestSiblings": true }
    ],
    "no-console": ["warn", { "allow": ["warn", "error"] }],
    "no-void": "error",
    "no-var": "error",
    "radix": "error",
    "padding-line-between-statements": [
      "error",
      { "blankLine": "always", "prev": "*", "next": "return" }
    ],
    "react/no-access-state-in-setstate": "error",
    "react/no-did-mount-set-state": "error",
    "react/no-did-update-set-state": "error",
    "react/no-this-in-sfc": "error",
    "react/prefer-es6-class": ["error", "always"],
    "react/no-unused-state": "error",
    "react/jsx-boolean-value": "error", // пропы с булевыми значениями не нуждаются в указании значения true
    "react/jsx-curly-brace-presence": [
      "error",
      {
        "props": "never",
        "children": "never"
      }
    ], // для пропов, которые могут быть заданы строкой, ={} нельзя использовать
    "react/jsx-fragments": ["error", "syntax"], // <></> вместо React.Fragment. В противном случае нужно использовать нормальный элемент
    "react/jsx-no-bind": [
      "error",
      {
        "allowArrowFunctions": true
      }
    ],
    "react/jsx-no-script-url": "error",
    "react/jsx-no-useless-fragment": "error",
    "react/jsx-sort-props": [
      "error",
      {
        "callbacksLast": true,
        "shorthandFirst": true,
        "noSortAlphabetically": true,
        "reservedFirst": true
      }
    ],
    "react/display-name": "off",
    // Включить после фикса всех ошибок
    "@typescript-eslint/ban-ts-comment": "off"
  }
}
